﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

//int main(int argc, char* argv[])
//{
//
//	string a = "hello world";
//
//	string b = a;
//
//	if (a.c_str() == b.c_str())
//
//	{
//
//		cout << "true" << endl;
//
//	}
//
//	else cout << "false" << endl;
//
//	string c = b;
//
//	c = "";
//
//	if (a.c_str() == b.c_str())
//
//	{
//
//		cout << "true" << endl;
//
//	}
//
//	else cout << "false" << endl;
//
//	a = "";
//
//	if (a.c_str() == b.c_str())
//
//	{
//
//		cout << "true" << endl;
//
//	}
//
//	else cout << "false" << endl;
//
//	return 0;
//
//}

//
//int main()
//
//{
//
//	string str("Hello Bit.");
//
//	str.reserve(111);
//
//	str.resize(5);
//
//	str.reserve(50);
//
//	cout << str.size() << ":" << str.capacity() << endl;
//
//	return 0;
//
//}

//int main(int argc, char* argv[])
//{
//
//	string strText = "How are you?";
//
//	string strSeparator = " ";
//
//	string strResult;
//
//	int size_pos = 0;
//
//	int size_prev_pos = 0;
//
//	while ((size_pos = strText.find_first_of(strSeparator, size_pos)) != string::npos)
//
//	{
//
//		strResult = strText.substr(size_prev_pos, size_pos - size_prev_pos);
//
//		cout << strResult << " ";
//
//		size_prev_pos = ++size_pos;
//
//	}
//
//	if (size_prev_pos != strText.size())
//
//	{
//
//		strResult = strText.substr(size_prev_pos, size_pos - size_prev_pos);
//
//		cout << strResult << " ";
//
//	}
//
//	cout << endl;
//
//	return 0;
//}
//
//请你来实现一个 myAtoi(string s) 函数，使其能将字符串转换成一个 32 位有符号整数（类似 C / C++ 中的 atoi 函数）。
//
//函数 myAtoi(string s) 的算法如下：
//
//读入字符串并丢弃无用的前导空格
//检查下一个字符（假设还未到字符末尾）为正还是负号，读取该字符（如果有）。 确定最终结果是负数还是正数。 如果两者都不存在，则假定结果为正。
//读入下一个字符，直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
//将前面步骤读入的这些数字转换为整数（即，"123" -> 123， "0032" -> 32）。如果没有读入数字，则整数为 0 。必要时更改符号（从步骤 2 开始）。
//如果整数数超过 32 位有符号整数范围[−231, 231 − 1] ，需要截断这个整数，使其保持在这个范围内。具体来说，小于 −231 的整数应该被固定为 −231 ，大于 231 − 1 的整数应该被固定为 231 − 1 。
//返回整数作为最终结果。

//class Solution 
//{
//public:
//    int myAtoi(string str) 
//    {
//        int len = str.size();
//        int cur = 0;
//        while (cur < len && str[cur] == ' ')
//        {
//            cur++;
//        }//跳过前置空格
//
//        if (len == cur)//说明为空字符串，直接返回0
//        {
//            return 0;
//        }
//
//        int flag = 1;//默认为正数
//        if (str[cur] == '+' || str[cur] == '-')//根据出现的符号给flag赋值
//        {
//            flag = str[cur++] == '-' ? -1 : 1;
//        }
//
//        long long int result = 0;//long long 方便判断是否超出整形范围
//        while (cur < len && isdigit(str[cur]))
//        {
//            result = result * 10 + (str[cur++] - '0');
//            if (result * flag > INT_MAX)
//            {
//                return INT_MAX;
//            }
//            if (result * flag < INT_MIN)
//            {
//                return INT_MIN;
//            }
//        }
//        return result * flag;
//    }
//};
//
//

//编写一个函数，其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
//
//不要给另外的数组分配额外的空间，你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题
#include<vector>

//class Solution 
//{
//public:
//    void reverseString(vector<char>& s) 
//    {
//        /*reverse(s.begin(), s.end());*/
//        int len = s.size();
//        for (int left = 0, right = len - 1; left < right; left++, right--)
//        {
//            swap(s[left], s[right]);
//        }
//    }
//};

//给定一个字符串 s ，找到 它的第一个不重复的字符，并返回它的索引 。如果不存在，则返回 - 1 。

//class Solution 
//{
//public:
//    int firstUniqChar(string s) 
//    {
//        int arr[255] = { 0 };
//        int i = 0, len = s.size();
//        while (i < len)
//        {
//            arr[s[i++] - '0']++;
//        }
//        i = 0;
//        for (i = 0; i < len; i++)
//        {
//            if (arr[s[i] - '0'] == 1)
//            {
//                return i;
//            }
//        }
//        return -1;
//    }
//};


//如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后，短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
//
//字母和数字都属于字母数字字符。
//
//给你一个字符串 s，如果它是 回文串 ，返回 true ；否则，返回 false 。


class Solution
{
public:
    bool isPalindrome(string s)
    {
        int i = 0, len = s.size();
        while (i < len)
        {
            if (s[i] >= 65 && s[i] <= 90)
            {
                s[i] = s[i] + 32;
            }
            i++;
        }//将大写字符转换为小写
        int left = 0, right = len - 1;
        while (left < right)
        {
            while (left < right && !isalnum(s[right]))
            {
                right--;
            }
            while (left < right && !isalnum(s[left]))
            {
                left++;
            }
            if (s[left] != s[right])
            {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
};